package javase_class_250904;

/**
 * ClassName: TestPolymorphism
 * Package: javase_class_250904
 * Description:
 *
 * @Author harkjeans
 * @Create 2025/9/4 18:10
 * @Version 1.0
 */

/**
 * 一、什么是多态？
 * 多态（Polymorphism） 的字面意思是“多种形态”。在Java中，它指的是同一个行为（方法）具有多个不同表现形式或形态的能力。
 * 更具体地说，它允许你使用一个父类类型的引用来指向一个子类的对象，并且根据这个引用实际指向的对象类型来调用其相应的方法。
 *
 * 二、多态的作用与好处
 * 消除类型之间的耦合关系：提高了代码的灵活性和可扩展性。
 * 可替换性：多态使得代码可以对已有的代码进行替换（例如，将子类的对象传递给一个期望父类参数的方法）。
 * 可扩展性：允许随时新增子类来扩展功能，而无需修改基于父类的现有代码。这符合“开闭原则”（对扩展开放，对修改关闭）。
 * 接口性：多态是超类（父类或接口）通过方法签名向子类提供了一个共同的接口，由子类来具体实现。
 *
 * 三、多态的实现基础：三个必要条件
 * 要实现多态，必须同时满足以下三个条件，缺一不可：
 * 继承：必须存在继承关系。
 * 重写：子类必须对父类中的某些方法进行重写（Override）。
 * 向上转型：父类的引用必须指向子类的对象（即 Parent p = new Child();）。
 *
 * */

public class TestPolymorphism {
    public static void main(String[] args) {
        Animal a1 = new Dog();
        Animal a2 = new Cat();

        a1.makeSound();
        a2.makeSound();
        // 注意：编译看左边，运行看右边
        // - 编译期（Compiler）：编译器检查的是引用类型（Animal）是否有makeSound()方法。
        // - 运行期（JVM）：JVM找到引用实际指向的对象（Dog或Cat），然后调用该对象的方法

        // ！！！重要的限制 ！！！
        // myAnimal1.fetch(); // 这行代码会编译报错！
        // 错误：找不到符号。因为编译器认为myAnimal1是Animal类型，而Animal类中没有fetch()方法。
        // 尽管它实际指向的是一个Dog对象。

        // 如果想调用Dog特有的方法，需要向下转型
        if (a1 instanceof Dog) {
            Dog myDog = (Dog) a1; // 向下转型
            myDog.fetch(); // 输出：狗在叼飞盘
        }
    }
}

class Animal{
    public void makeSound(){
        System.out.println("动物发出叫声");
    }
}
class Dog extends Animal{
    @Override
    public void makeSound(){
        System.out.println("汪汪汪");
    }
    public void fetch(){
        System.out.println("狗在叼飞盘");
    }
}
class Cat extends Animal{
    @Override
    public void makeSound(){
        System.out.println("喵喵喵");
    }
}









